﻿// Upgrade NOTE: replaced 'mul(UNITY_MATRIX_MVP,*)' with 'UnityObjectToClipPos(*)'

//运动模糊
//本节是对运动模糊的一种简单实现。我们混合了连续帧之间的图像，这样得到一张具有模糊拖尾的图像。
//然而，当物体运动速度过快时，这种方法可能会造成单独的帧图像变得可见。在第13章中，我们会学习如何利用深度纹理重建速度来模拟运动模糊效果。
Shader "Chapter12/ex12_5_MotionBlur" {
	properties{
		_MainTex ("Base (RGB)", 2D) = "white" {}
		_BlurAmount ("Blur Amount", Float) = 1.0
	}
	SubShader{


		CGINCLUDE
		#include "UnityCG.cginc"
		
		sampler2D _MainTex;
		fixed _BlurAmount;
		
		struct v2f {
			float4 pos : SV_POSITION;
			half2 uv : TEXCOORD0;
		};
		
		v2f vert(appdata_img v) {
			v2f o;
			
			o.pos = UnityObjectToClipPos(v.vertex);
			
			o.uv = v.texcoord;
					 
			return o;
		}
		//一个用于更新渲染纹理的RGB通道部分， 
		fixed4 fragRGB (v2f i) : SV_Target {
			return fixed4(tex2D(_MainTex, i.uv).rgb, _BlurAmount);  //RGB通道版本的Shader对当前图像进行采样，并将其A通道的值设为_BlurAmount，
																	//以便在后面混合时可以使用它的透明通道进行混合。

		}

		//另一个 用于 更新 渲染 纹理 的 A 通道 部分：
		half4 fragA (v2f i) : SV_Target {
			return tex2D(_MainTex, i.uv);//直接返回采样结果
		}
		ENDCG

		ZTest Always Cull Off ZWrite Off
		//第一个pass,用于更新渲染纹理的RGB通道
		//所以要把A通道和RGB通道分开，是因为在更新RGB时我们需要设置它的A通道来混合图像，但又不希望A通道的值写入渲染纹理中。？？？？？不明白
		Pass {
			Blend SrcAlpha OneMinusSrcAlpha
			ColorMask RGB
			
			CGPROGRAM
			
			#pragma vertex vert  
			#pragma fragment fragRGB  
			
			ENDCG
		}
		//第二个pass,用于更新A通道
		Pass {   
			Blend One Zero
			ColorMask A
			   	
			CGPROGRAM  
			
			#pragma vertex vert  
			#pragma fragment fragA
			  
			ENDCG
		}
	}
	FallBack Off
}
